widget: Avoid a crash in crossing event handling
authorMatthias Clasen <mclasen@redhat.com>
Wed, 26 Aug 2020 11:24:54 +0000 (07:24 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 26 Aug 2020 11:26:49 +0000 (07:26 -0400)
We need to make sure that the crossing data stays
alive until we are done handling it, so take references
on all the widgets in it.

gtk/gtkwidget.c

index 9f538f42ead46eed73922bdb7f539d15530be68e..e8106fca8400c854069bfabaa598d8fa39add764 100644 (file)
@@ -4376,12 +4376,30 @@ gtk_widget_handle_crossing (GtkWidget             *widget,
 
   g_object_ref (widget);
 
+  if (crossing->old_target)
+    g_object_ref (crossing->old_target);
+  if (crossing->new_target)
+    g_object_ref (crossing->new_target);
+  if (crossing->old_descendent)
+    g_object_ref (crossing->old_descendent);
+  if (crossing->new_descendent)
+    g_object_ref (crossing->new_descendent);
+
   for (l = priv->event_controllers; l; l = l->next)
     {
       GtkEventController *controller = l->data;
       gtk_event_controller_handle_crossing (controller, crossing, x, y);
     }
 
+  if (crossing->old_target)
+    g_object_unref (crossing->old_target);
+  if (crossing->new_target)
+    g_object_unref (crossing->new_target);
+  if (crossing->old_descendent)
+    g_object_unref (crossing->old_descendent);
+  if (crossing->new_descendent)
+    g_object_unref (crossing->new_descendent);
+
   g_object_unref (widget);
 }